package com.taxi.driver.util;

import android.content.Context;
import android.os.Bundle;

import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechSynthesizer;
import com.iflytek.cloud.SpeechUtility;
import com.iflytek.cloud.SynthesizerListener;
import com.socks.library.KLog;
import com.taxi.driver.data.user.UserRepository;

public class SpeechUtil {

    private static UserRepository sUserRepository;

    /**
     * 初始化讯飞语音，一般在Application中调用
     *
     * @param context
     * @param xfyunId
     */
    public static void init(Context context, String xfyunId, UserRepository userRepository) {
        sUserRepository = userRepository;
        SpeechUtility.createUtility(context.getApplicationContext(), SpeechConstant.APPID + "=" + xfyunId);
    }

    /**
     * 播放语音
     *
     * @param context
     * @param strRes
     */
    public static void speech(Context context, int strRes) {
        String str = context.getResources().getString(strRes);
        speech(context, str);
    }

    /**
     * 播放语音
     *
     * @param context
     * @param string
     */
    public static void speech(Context context, String string) {

        //1.创建 SpeechSynthesizer 对象, 第二个参数:本地合成时传 InitListener
        SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer(context, null);
        //2.合成参数设置,详见《MSC Reference Manual》SpeechSynthesizer 类
        //  设置发音人(更多在线发音人,用户可参见 附录13.2
        mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");
        // 自动，不确定时按照串发音
        mTts.setParameter("rdn", "3");
        // 设置发音人
        mTts.setParameter(SpeechConstant.SPEED, "80");//设置语速
        if (sUserRepository!=null){
            mTts.setParameter(SpeechConstant.VOLUME, sUserRepository.getXFVolumeSize() + "");
        }

        // 设置音量,范围 0~100
        mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
        // 设置云端
        // 设置合成音频保存位置(可自定义保存位置),保存在“./sdcard/iflytek.pcm”
        // 保存在 SD 卡需要在 AndroidManifest.xml 添加写 SD 卡权限
        // 仅支持保存为 pcm 和 wav 格式,如果不需要保存合成音频,注释该行代码
        mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm");
        //3.开始合成
        mTts.startSpeaking(string, mSynListener);
    }

    // 停止语音播报
    public static void stop(Context context) {
        //1.创建 SpeechSynthesizer 对象, 第二个参数:本地合成时传 InitListener
        SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer(context, null);
        // 如果正在播报，则关闭语音播报
        if (mTts.isSpeaking()) {
            mTts.stopSpeaking();
        }
    }

    //合成监听器
    private static SynthesizerListener mSynListener = new SynthesizerListener() {

        //会话结束回调接口,没有错误时,error为null
        public void onCompleted(SpeechError error) {

        }

        //缓冲进度回调 //percent为缓冲进度0~100,beginPos为缓冲音频在文本中开始位置,endPos表示缓冲音频在文本中结束位置,info为附加信息。
        public void onBufferProgress(int percent, int beginPos, int endPos, String info) {

        }

        //开始播放
        public void onSpeakBegin() {
            KLog.d("SpeechUtil#onSpeakBegin(): ");
        }

        //暂停播放
        public void onSpeakPaused() {

        }

        //播放进度回调 //percent为播放进度0~100,beginPos为播放音频在文本中开始位置,endPos表示播放音频在文本中结束位置.
        public void onSpeakProgress(int percent, int beginPos, int endPos) {

        }

        //恢复播放回调接口
        public void onSpeakResumed() {

        }

        //会话事件回调接口
        public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {

        }
    };
}
